package com.kaifamiao.wendao.controller;

import com.kaifamiao.wendao.entity.Topic;
import com.kaifamiao.wendao.service.TopicService;
import com.kaifamiao.wendao.utils.Pagination;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
import java.util.logging.Logger;

@WebServlet( "/topic/*" )
public class TopicServlet extends HttpServlet {

    private Logger logger = Logger.getLogger( this.getClass().getName() );
    // 用实例变量来引用 TopicService 实例
    private TopicService topicService = new TopicService();

    @Override
    protected void service( HttpServletRequest request , HttpServletResponse response )
            throws ServletException, IOException {
        // 获取本次请求路径
        String uri = request.getRequestURI();
        // 获取请求方式(即相应的HTTP动作)
        String method = request.getMethod();
        // 尝试从请求路径中获得首个分号的位置
        int end = uri.indexOf( ";") ;
        // 若请求路径中没有分号则以 uri 长度为结束位置
        end = end == -1 ? uri.length() : end ;
        // 从请求路径中截取前缀之后的内容
        String path = uri.substring( 0 , end );
        logger.info( path );

        // 如果以 GET方式 请求 "/topic/list" 则打开登录页面
        if( "GET".equals( method ) && "/topic/list".equals( path ) ){
            topicList( request , response );
            return ;
        }

        // 如果以 GET方式 请求 "/topic/detail" 则打开登录页面
        if( "GET".equals( method ) && "/topic/detail".equals( path ) ){
            topicDetail( request , response );
            return ;
        }
    }

    // 分页显示话题列表
    private void topicList( HttpServletRequest request , HttpServletResponse response )
            throws ServletException, IOException {
        final Integer defaultPageSize = 3 ; // 每页默认显示的行数
        Integer pageSize ; // 每页最多显示的行数
        HttpSession session = request.getSession();
        /* - - - 1、确定每页显示的记录数( pageSize ) - - - */
        // 尝试从请求参数中获取 size 参数值 ( 用户可能通过点击超链接确定每页显示的记录数 )
        String size = request.getParameter( "size" );
        // 如果 size 不存在或者是空串 (意味着客户端请求时没有指定size参数或参数是空白)
        if( size == null || ( size = size.trim() ).isEmpty() ) {
            // 则尝试从 会话对象中获取 pageSize 属性
            pageSize = (Integer) session.getAttribute( "pageSize" );
            // 如果会话中没有 pageSize 属性 或 其取值小于等于零 则给 pageSize 赋予一个默认值
            pageSize = pageSize == null || pageSize <= 0 ? defaultPageSize : pageSize ;
        } else {
            // 如果客户端请求时指定了 size 参数，则将其转换为 Integer 类型的对象
            pageSize = Integer.valueOf( size );
            // 若客户端指定的数值小于等于零则采用默认值
            pageSize = pageSize <= 0 ? defaultPageSize : pageSize ;
        }
        // 将 pageSize 设置到 会话对象 的属性中
        session.setAttribute( "pageSize" , pageSize );

        /* - - -  2、确定当前页( currentPage) - - - */
        // 从请求参数中获取当前页码
        String current = request.getParameter( "current" );
        // 如果 current 不存在或者是空串 则指定第一页为当前页
        current = current == null || ( current = current.trim() ).isEmpty() ? "1" : current ;
        // 将当前页面转换为整数值
        Integer currentPage = Integer.valueOf( current );

        /* - - -  3、统计总记录数( totalPage )  - - - */
        Integer totalPage = topicService.countPages( pageSize );

        // 如果客户端请求时指定的 current 参数值大于 总页数则以第一页为当前页
        currentPage = currentPage > totalPage ? 1 : currentPage ;

        /* - - -  4、查询当前页需要显示的列表  - - - */
        List<Topic> list = topicService.paging( currentPage , pageSize );

        /* - - -  5、封装分页组件并将其设置到请求属性中  - - - */
        Pagination<Topic> pagination = new Pagination<>( pageSize , totalPage , currentPage , list );
        // 将 Pagination 设置到 request 的属性中
        request.setAttribute( "pagination" , pagination );

        // 6、转发到话题列表页面
        String path = "/WEB-INF/pages/topic/list.jsp" ;
        RequestDispatcher dispatcher = request.getRequestDispatcher( path );
        dispatcher.forward( request , response );
    }

    // 显示话题详情
    private void topicDetail( HttpServletRequest request , HttpServletResponse response )
            throws ServletException, IOException {
        // 从查询字符串中获取请求参数
        String idString = request.getParameter( "id" );
        // 解析字符串为整数并返回其相应的包装类类型的实例
        Integer id = Integer.valueOf( idString );
        // 查询指定id对应的话题
        Topic t = topicService.load( id );
        // 将 话题 设置到 请求对象 的属性中
        request.setAttribute( "topic" , t );
        String path = "/WEB-INF/pages/topic/detail.jsp" ;
        // 去往详情页面
        RequestDispatcher dispatcher = request.getRequestDispatcher( path );
        dispatcher.forward( request , response );
    }
}
